# @符号

# @作为修饰符

有如下代码

def funB(funA):
    print("in funB")
    return "return from FunB()"

@funB
def funA():
    print("in FunA")
    return "return from FunA()"

# @funB​​等价于funB(funA)​​

@funB​这里的funB​就是修饰函数,用来修饰输入进来的函数,所以funB​的参数是一个函数,也就是这里的funA​。直接运行以上代码,得到的输出如下:

in funB

也就是说,程序进入了funB​函数。

# 修饰函数返回的是修饰完的函数

重点啊!这是理解修饰符含义的核心!修饰函数返回的是修饰完的函数!!!
运行下面代码:

def funB(funA):
    print("in funB")
    return "return from FunB()"

# @funB
def funA():
    print("in FunA")
    return "return from FunA()"

print(funA)

没有修饰的情况下,funA​​理论上输出的是一个function对象。输出:

<function funA at 0x0000016CB7AD0CA0>

加上修饰后的结果:

in funB
return from FunB()

输出的第一行in funB​​是之前所说进入funB​​函数内print的内容;第二行就是print(funA)​​的输出结果,可见funA = "return from FunA()"​​,是一个字符串,而不是函数对象。

# @作为运算符

用于向量、矩阵乘法,等价于np.dot​​:

import numpy as np

num1 = np.array([1,2,3])
num2 = np.array([[1,2,3]])
print(num1.shape)
print(num2.shape)
print('==============')
print(num1 @ num1)
print(num2 @ num2.T)
print(num2.T @ num2)
print('==============')
print(np.dot(num1, num1))
print(np.dot(num2, num2.T))
print(np.dot(num2.T, num2))

输出结果:

(3,)
(1, 3)
==============
14
[[14]]
[[1 2 3]
 [2 4 6]
 [3 6 9]]
==============
14
[[14]]
[[1 2 3]
 [2 4 6]
 [3 6 9]]